package com.kaoyaya.util;

import java.lang.reflect.Type;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
 * GSON 工作类，它是用占位字符，反向来做的，如果用泛型从外面传类型过来，则会报错，因为JAVA的泛型是运行时擦除的
 * 例如 public static <T> T str2json (String str) 这种写法，运行时就会出错
 * @author Goven
 * @date 2012-12-13
 */
public class JsonUtil {
	
	private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
	private static Gson gson;
	
	private static Gson getGson(){
		if(gson == null){
			gson = new GsonBuilder().serializeNulls().setDateFormat(DATE_FORMAT).create();
		}
		return gson;
	}
	
	/**
	 * json数据转换成Map对象
	 * @param json json数据
	 * @return Map对象
	 */
	public static Map<String, Map<String, String[]>> json2Map(String json) {
		if (StringUtil.isTrimBlank(json)) {
			return null;
		}
		Type type =new TypeToken<Map<String, Map<String, String[]>>>(){}.getType();
		return getGson().fromJson(json, type);
	}
	/**
	 * json数据转换成任何对象
	 * @param json json数据
	 * @return 任何对象
	 */
	public static <T> T json2Any(String json,Type type) {
		try {
			return getGson().fromJson(json, type);
		} catch (Exception e) {
			return null;
		}
	}
	/**
	 * 把JSON转化为对象
	 * @param json json对象
	 * @return 返回的对象
	 */
	public static <T> T json2Obj(String json ,Class<T> clazz){
		try {
			return getGson().fromJson(json, clazz);
		} catch (Exception e) {
			return null;
		}
		
	}
	/**
	 * 把对象转成JSON数据
	 * @param object 对象
	 * @return json字符串
	 */
	public static String  toJson(Object object){
		return getGson().toJson(object);
	}
	
}
